#ifndef ORDER_H
#define ORDER_H

#include <string>
#include <ctime>
#include "User.h"
#include "Flight.h"
#include "Seat.h"
#include "Date.h"

// 订单状态枚举
enum class OrderStatus {
    PENDING,    // 待支付
    PAID,       // 已支付
    CANCELED,   // 已取消
    COMPLETED   // 已完成
};

class Order {
private:
    string orderId;          // 订单唯一编号
    User* user;              // 关联用户
    Flight* flight;          // 关联航班
    Seat* seat;              // 关联座位
    double totalPrice;       // 订单总价
    OrderStatus status;      // 订单状态
    Date createTime;         // 创建时间
    Date payTime;            // 支付时间
    string paymentMethod;    // 支付方式
    string remark;           // 备注信息

public:
    // 构造与析构
    Order();
    ~Order();
    
    // Getter/Setter方法
    string getOrderId() const;
    User* getUser() const;
    Flight* getFlight() const;
    Seat* getSeat() const;
    double getTotalPrice() const;
    OrderStatus getStatus() const;
    Date getCreateTime() const;
    Date getPayTime() const;
    string getPaymentMethod() const;
    string getRemark() const;
    void setOrderId(const string& id);
    void setUser(User* u);
    void setFlight(Flight* f);
    void setSeat(Seat* s);
    void setTotalPrice(double price);
    void setStatus(OrderStatus s);
    void setCreateTime(const Date& time);
    void setPayTime(const Date& time);
    void setPaymentMethod(const string& method);
    void setRemark(const string& r);
    
    // 核心业务方法
    void initOrder(User* user, Flight* flight, Seat* seat);
    bool pay(const string& paymentMethod);
    bool cancel(const string& reason);
    string generateOrderId();
    double calculateRefund();
    bool canChangeFlight() const;
    Order* changeFlight(Flight* newFlight, Seat* newSeat);
};

#endif // ORDER_H